import java.awt.*;
import java.awt.geom.*;

/**
* Transformation eines Rechtecks: Rotation
*
* @author Frank Klawonn
* Letzte Aenderung 07.01.2005
* @see TransformationOrderExample
* @see TransformationOrderExampleT
* @see TransformationOrderExampleRT
* @see TransformationOrderExampleTR
*/
public class TransformationOrderExampleR extends Frame
{
  private int windowHeight;

  /**
  * Konstruktor
  *
  * @param height  Dieser Wert sollte die Hoehe des Fensters angeben.
  */
  TransformationOrderExampleR(int height)
  {
    //Ermoeglicht das Schliessen des Fensters
    addWindowListener(new MyFinishWindow());

    windowHeight = height;
  }


  public void paint(Graphics g)
  {
    Graphics2D g2d = (Graphics2D) g;

    /*In yUp wird die Translation definiert, mit der Objekte in "realen"
      Koordinaten, bei denen die y-Achse nach oben zeigt, so in das
      Fenster gezeichnet werden, dass der Koordinatenursprung sich links
      unten im Fenster im Fensterkoordinatenpunkt (40,windowHeight-50)
      befindet.
    */
    AffineTransform yUp = new AffineTransform();
    yUp.setToScale(1,-1);
    AffineTransform translate = new AffineTransform();
    translate.setToTranslation(120,windowHeight-130);
    yUp.preConcatenate(translate);

    //Wende die Transformation auf das Graphics2D-Objekt an. Damit wird
    //alles in realen Koordinaten gezeichnet.
    g2d.transform(yUp);

    //Die Linien sollen eine Dicke von 3.0 statt 1.0 haben.
    g2d.setStroke(new BasicStroke(3.0f));

    //Erzeuge ein Rechteck, das rotiert werden soll.
    Rectangle2D.Double rect = new Rectangle2D.Double(-40,-20,80,40);

    //Definiere eine Rotation.
    AffineTransform rotation = new AffineTransform();
    rotation.setToRotation(Math.PI/4);

    //Zeichne das skalierte Rechteck.
    g2d.draw(rotation.createTransformedShape(rect));


    g2d.setStroke(new BasicStroke(1.0f));
    //Einzeichnen des Koordinatensystems
    drawSimpleCoordinateSystem(80,80,g2d);

  }


    /**
  * Zeichnet ein Koordinatensystem.
  *
  * @param xmax     x-Koordinate, bis zu der die x-Achse reichen soll
  * @param ymax     y-Koordinate, bis zu der die y-Achse reichen soll
  * @param g2d      Graphics2D-Objekt, auf das gezeichnet werden soll.
  */
  public static void drawSimpleCoordinateSystem(int xmax, int ymax,
                                                Graphics2D g2d)
  {
    int xOffset = -100;
    int yOffset = -100;
    int step = 20;
    String s;
    //aktuellen Font merken
    Font fo = g2d.getFont();
    //einen kleinen Font einstellen
     int fontSize = 13;
    Font fontCoordSys = new Font("serif",Font.PLAIN,fontSize);
    /*
      Leider werden die Buchstaben durch die auf das Graphics2D-Objekt
      angewendete Transformation auf dem Kopf gezeichnt. Daher: Erzeugung
      eines Fonts, bei dem die Buchstaben auf dem Kopf stehen.
    */
    //Auf den Kopf stellen durch Spiegeln.
    AffineTransform flip = new AffineTransform();
    flip.setToScale(1,-1);
    //Wieder auf die Grundlinie zurueck verschieben.
    AffineTransform lift = new AffineTransform();
    lift.setToTranslation(0,fontSize);
    flip.preConcatenate(lift);

    //Font mit auf den Kopf gestellten Buchstaben erzeugen.
    Font fontUpsideDown = fontCoordSys.deriveFont(flip);

    g2d.setFont(fontUpsideDown);

    //x-Achse
    g2d.drawLine(xOffset,0,xmax,0);
    //Markierungen und Beschriftung der x-Achse
    for (int i=xOffset+step; i<=xmax; i=i+step)
    {
      g2d.drawLine(i,-2,i,2);
      if (i!=0)
      {
        g2d.drawString(String.valueOf(i),i-7,-30);
      }
    }

    //y-Achse
    g2d.drawLine(0,yOffset,0,ymax);

    //Markierungen und Beschriftung der y-Achse
    for (int i=yOffset+step; i<=ymax; i=i+step)
    {
      g2d.drawLine(-2,i,2,i);
      //Einruecken der Zahlen
      if (Math.abs(i)>99)
      {
        s="";
      }
      else
      {
        if (Math.abs(i)>9)
        {
          s="  ";
        }
        else
        {
          s="    ";
        }
      }
      if (i>=0){ s = s+" ";}
      if (i!=0)
      {
        g2d.drawString(s+String.valueOf(i),-25,i-20);
      }
    }

    //Font zurueck setzen
    g2d.setFont(fo);
  }


  public static void main(String[] argv)
  {
    int height = 260;
    TransformationOrderExampleR f = new TransformationOrderExampleR(height);
    f.setTitle("Nur Rotation");
    f.setSize(230,height);
    f.setVisible(true);
  }


}


